package modelo.personas.pacientes;


import geografia.GestorLocalidad;
import geografia.Localidad;
import hibernate.Busqueda;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import modelo.CriterioBusqueda;
import modelo.GestorModelo;
import modelo.personas.GestorDocumento;
import modelo.personas.GestorDomicilio;
import modelo.personas.GestorTelefono;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author raul
 */
public class GestorPaciente extends GestorModelo<Paciente> {

    private HashMap<String, String> mapFiltros;

    public GestorPaciente() {
        mapFiltros = new HashMap();
        mapFiltros.put("Nro Historia Clinica", "hc.numero");
        mapFiltros.put("Nro Documento", "doc.numero");
        mapFiltros.put("Nombre", "nombre");
        mapFiltros.put("Apellido","apellido");
        mapFiltros.put("Localidad", "loc.nombre");
        mapFiltros.put("Provincia", "prov.nombre");
    }

    @Override
    public void eliminar() {
        getModelo().setEstado(ELIMINADO);
        super.actualizar();
    }

    @Override
    public void crearModelo() {
        super.setModelo(new Paciente());
    }
    
    public void setDocumento(String tipo, int numero) {
        GestorDocumento gestorD= new GestorDocumento();
        gestorD.crearModelo();
        gestorD.getModelo().setTipo(tipo);
        gestorD.getModelo().setNumero(numero);
        getModelo().setDocumento(gestorD.getModelo());
    }
    
    public void setDomicilio(String calle, int altura, int piso, String departamento,
            String barrio, Localidad localidad){
        GestorDomicilio gD = new GestorDomicilio();
        gD.crearModelo();
        gD.getModelo().setCalle(calle);
        gD.getModelo().setAltura(altura);
        gD.getModelo().setBarrio(barrio);
        gD.getModelo().setPiso(piso);
        gD.getModelo().setDepartamento(departamento);
        gD.getModelo().setLocalidad(localidad);
        getModelo().getDomicilios().clear();
        getModelo().getDomicilios().add(gD.getModelo());
    }

    public void agregarTelefonos(List telefonos) {
        getModelo().getTelefonos().addAll(telefonos);
        getModelo().getTelefonos().retainAll(telefonos);
    }

    public List listarPacientes(){
        return super.listarClase(Paciente.class);
    }

    @Override
    public boolean noExiste() {
        Busqueda busq = new Busqueda(Paciente.class);
        busq.crearAlias("documento", "doc");
        busq.addEq("nombre", getModelo().getNombre());
        busq.addEq("apellido", getModelo().getApellido());
        busq.addEq("doc.numero", getModelo().getDocumento().getNumero());
        return busq.ejecutar().isEmpty();
    }

    @Override
    protected Paciente clonar(Paciente modelo) throws CloneNotSupportedException {
        return (Paciente) modelo.clone();
    }

    public List listarProvincias() {
        GestorLocalidad gL = new GestorLocalidad();
        return gL.listarProvincias();
    }
    
    public List buscarLocalidad(String provincia) {
        GestorLocalidad gL = new GestorLocalidad();
        return gL.buscar("Provincia", provincia);
    }
    
    public List buscarLocalidad(Integer codigoPostal) {
        GestorLocalidad gL = new GestorLocalidad();
        return gL.buscar("Codigo Postal", codigoPostal);
    }
    
    public Object nuevoTelefono(String codArea, int nroTelefono) {
        GestorTelefono gT= new GestorTelefono();
        return gT.crearModelo(codArea,nroTelefono);
    }

    @Override
    public List buscar(CriterioBusqueda[] criterios) {
        
        Busqueda busq = new Busqueda(Paciente.class);
        busq.crearAlias("documento", "doc");
        busq.crearAlias("domicilios", "dom");
        busq.crearAlias("dom.localidad", "loc");
        busq.crearAlias("loc.provincia", "prov");
        busq.crearAlias("historiaClinica","hc");
        busq.addEq("estado", ACTIVO);
        super.addRestricciones(busq, criterios, mapFiltros);
        busq.agregarOrdenAsc("apellido");
        busq.agregarOrdenAsc("nombre");
        return busq.ejecutar();//quitarRepeticionesDeLista()
    }

    public void eliminarPariente(Object pariente) {
        getModelo().getParientes().remove((Pariente) pariente);
    }
    
    public boolean tienePariente(Pariente pariente) {
        return getModelo().getParientes().contains(pariente);
    }
    
    public void agregarPariente(Pariente pariente) {
        getModelo().getParientes().add(pariente);
    }

    public void eliminarParientesNoGuardados() {
        Iterator<Pariente> i = getModelo().getParientes().iterator();
        while (i.hasNext()) {
            Pariente p = i.next();
            if (p.getId() == null)
                eliminarPariente(p);
        }
    }

    public void eliminarConsultasNoGuardadas() {
        Iterator<DetalleHistoriaClinica> i = getModelo().getHistoriaClinica().getDetallesHistoriaClinica().iterator();
        while (i.hasNext()) {
            DetalleHistoriaClinica d = i.next();
            if (d.getId() == null)
                eliminarConsulta(d);
        }
    }
    
    public void eliminarConsulta(Object consulta) {
        getModelo().getHistoriaClinica().getDetallesHistoriaClinica()
                .remove((DetalleHistoriaClinica) consulta);
    }

    public Paciente buscarPorId(Long id) {
        
        Busqueda busq = new Busqueda(Paciente.class);
        busq.addEq("id", id);
        return (Paciente) busq.ejecutarUnique();
    }

}